package org.jflame.context.security.mask;

import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

import org.jflame.context.security.mask.MaskRule.NoneMaskFunc;

import java.lang.annotation.Documented;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import java.util.function.Function;

/**
 * 脱敏规则注解,用于标注需要脱敏的字段
 * 
 * @author charles.zhang
 */
@Documented
@Retention(RUNTIME)
@Target({ FIELD,METHOD })
@Inherited
public @interface Mask {

    /**
     * 使用内置规则,默认NONE即不使用内置规则
     * 
     * @return
     */
    MaskRule rule() default MaskRule.NONE;

    /**
     * 自定义脱敏规则类,实现Function接口. 如果没有指定内置rule,则该设置生效,如果未设置规则类则使用head,tail,symbol,symbolSize属性生成一个规则
     * 
     * @return
     */
    Class<? extends Function<String,String>> ruleClass() default NoneMaskFunc.class;

    /**
     * 头部保留多少个字符,默认1
     * 
     * @return
     */
    int head() default 1;

    /**
     * 尾部保留多少个字符
     * 
     * @return
     */
    int tail() default 0;

    /**
     * 脱敏符号固定个数,默认0表示数量与要替换字符个数相同
     * 
     * @return
     */
    int symbolSize() default 0;

    /**
     * 数据标识,用于权限判断
     * 
     * @return
     */
    String dataId() default "";
}
